// "use strict"


// function test(){
//      message = 'hi'
// }
// test()
// console.log('打印***message',message)

// if(true){
//     var m = 'var'
// }
// console.log('打印***m',m)

// if(1){
//     let l = 'let'
// }
// console.log(l);

// for (let i = 0; i < 5; i++) {
//     setTimeout(()=>{
//         console.log('i',i);
//     },0)
// }
// for (var j = 0; j < 5; j++) {
//     setTimeout(()=>{
//         console.log('j',j);
//     },0)
// }
// let a = Symbol('a')
// console.log(typeof undefined);
// console.log(typeof false);
// console.log(typeof 's');
// console.log(typeof 12);
// console.log(typeof {a:1});
// console.log(typeof function(){});
// console.log(typeof a);
// console.log(window);

// let message
// console.log(typeof message);
// console.log(typeof age);

// console.log(undefined===undefined);
// console.log(null===null);
// console.log(undefined == null);
// console.log(undefined === null);
// console.log(Boolean(undefined));

// let binNum = 0x1010
// let octNum = 070
// let n = 0.0000000000000000000000000000000000004
// console.log('打印***binNum',binNum)
// console.log('打印***octNum',octNum)
// console.log('打印***n',n)

// console.log('打印***Number.MIN_VALUE',Number.MIN_VALUE)

// console.log(0/0);
// console.log(-0/+0);

// console.log(5/0);
// console.log(-5/0);
// console.log(NaN ===NaN);
// console.log(isNaN(NaN));
// console.log(NaN.valueOf());
// console.log(NaN.valueOf().toString());

// console.log(Number(undefined));
// console.log(Number(null));
// console.log(Number('1.1'));
// console.log(Number('0xf'));
// console.log(Number('2d'));

// console.log(parseInt(null));
// console.log(parseInt(undefined));
// console.log(parseInt('1.2'));
// console.log(parseInt('0x83'));
// console.log(parseInt('0xf'));
// console.log(parseInt('f',16));
// console.log(parseInt('12',8));

// console.log(parseFloat('2d'));
// console.log(parseFloat(null));
// console.log(parseFloat(undefined));
// console.log(parseFloat('1.2'));
// console.log(parseFloat('0x83'));
// console.log(parseFloat('0xf'));
// console.log(parseFloat('2d'));

// console.log('fasdf\nfasdf');
// console.log('fasdf\tfasdf');
// console.log('fasdf\bfasdf');
// console.log('fasdf\rfasdf');
// console.log('fasdf\ffasdf');
// console.log('fasdf\\fasdf');
// console.log('fasdf\'fasdf');
// console.log('fasdf\"fasdf');
// console.log('fasdf\`fasdf');
// console.log('fasdf\x11fasdf');
// console.log('fasdf\u03a3fasdf'.length);

// let value = ''
// function append(){
//     value = `${value}abc`
//     console.log(value);
// }
// append()
// append()
// append()

// let a = 6
// let b = 9
// function simpleTag(strings, aValExpression, bValExpression, sumExpression) {
//     console.log('strings',strings);
//     console.log(aValExpression);
//     console.log(bValExpression);
//     console.log(sumExpression);

//     return 'footbar'
// }

// let untaggedResult = `${a} + ${b} = ${a + b}`
// let taggedResult = simpleTag`${a}+${b}=${a + b}`


// console.log(untaggedResult); // "6 + 9 = 15"
// console.log(taggedResult); // "foobar"

// function simpleTag(strings, ...expressions) {
//     console.log('打印***strings',strings)
//     for(const expression of expressions){
//         console.log(expression);
//     }
//     return 'footbar'
// }
// simpleTag`${a}+${b}=${a + b}-${a}-${b}=${a-b}`
// let untaggedResult = `${a} + ${b} = ${a + b}`
// let taggedResult = simpleTag`${a}+${b}=${a + b}-${a}-${b}=${a-b}`

//拼接 
// function zipTag(strings,...expressions){
//     for(const expression of expressions){
//         console.log(expression);
//     }
//     return strings[0]+expressions.map((e,i)=>`${e}${strings[i+1]}`).join('')
// }
// let untaggedResult = `${ a } + ${ b } = ${ a + b }`;
// let taggedResult = zipTag`${ a } + ${ b } = ${ a + b }`;
// console.log(untaggedResult); // "6 + 9 = 15"
// console.log(taggedResult); // "6 + 9 = 15"


// console.log(`\u00A9`);
// console.log('\u00A9');
// console.log(String.raw`\u00A9`);
// console.log(`first line
// second line
// `);
// console.log(String.raw`first line
// second line
// `);

// function printRaw(strings){
//     console.log('Actual characters',strings);
//     for(const string of strings){
//         console.log(string);
//     }
//     console.log('Escaped characters',strings.raw);
//     for(const rawString of strings.raw){
//         console.log(rawString);
//     }
// }

// printRaw`\u00A9${'and'}\n`


// let sy = Symbol()
// let sy1 = Symbol()
// console.log('打印***sy',sy===sy1)


// let myB = new Boolean()
// let myA = new Boolean()
// console.log(myA[[PrimitiveValue]]);
// console.log(myB);
// console.log(myB===myA);


// let glosy = Symbol.for('foo')
// let orsy = Symbol.for('foo')
// let sy = orsy
// console.log(glosy === orsy);
// console.log(sy === orsy);

// let glosy = Symbol.for()
// let orsy = Symbol.for()
// let sy = orsy
// console.log(glosy === orsy);
// console.log( orsy);

//使用symbol对象属性
// let s1 = Symbol('foo')
// let s2 = Symbol('bar')
// let s3 = Symbol('baz')

// let o = {
//     s1: 'foo',
//     s2: 'bar',
// [s1]:'foo-s'
// }
// console.log('打印***o',o)
// console.log('打印***o',o[s1])
// Object.defineProperty(o,s3,{value:'baz'})
// console.log('打印***o',o)
// Object.defineProperties(o,{
//     [s1]:{value:'foo'},
//     [s2]:{value:'bar'}
// })
// console.log('打印***o',o)
// console.log(Object.getOwnPropertyNames(o));
// console.log(Object.getOwnPropertySymbols(o));
// console.log(Object.getOwnPropertyDescriptors(o));
// console.log(Reflect.ownKeys(o));


// class Foo {
//     async *[Symbol.asyncIterator]() { }
// }
// let f = new Foo()
// console.log(f);
// console.log(f[Symbol.asyncIterator]());

// class Emitter {
//     constructor(max) {
//         this.max = max
//         this.asyncIdx = 0
//     }
//     async * [Symbol.asyncIterator](){
//         while (this.asyncIdx < this.max) {
//             yield new Promise(resolve => resolve(this.asyncIdx++))
//         }
//     }
// }

// async function asyncCount() {
//     let emitter = new Emitter(5)
//     for await (const x of emitter) {
//         console.log(x);
//     }
// }

// asyncCount()

// function Foo(){}
// let f = new Foo()
// console.log('打印***f',f)
// console.log(f instanceof Foo);
// console.log(new Function());
// console.log(Foo[Symbol.hasInstance](f));

// let initial = ['foo']
// let array = ['bar']
// console.log(array[Symbol.isConcatSpreadable]);
// console.log(initial.concat(array));

// array[Symbol.isConcatSpreadable]=false
// console.log(initial.concat(array));

// console.log(RegExp.prototype[Symbol.match]);
// console.log('foobar'.match(/bar/));

// class FooMatcher {
//     static [Symbol.match](target){
//         return target.includes('foo')
//     }
// }
// console.log('foobar'.match(FooMatcher));
// console.log('barbar'.match(FooMatcher));

// class StringMatcher{
//     constructor(str){
//         this.str = str
//     }
//     [Symbol.match](target){
//         return target.includes(this.str)
//     }
// }

// console.log('foobar'.match(new StringMatcher('foo')));
// console.log('foobar'.match(new StringMatcher('qux')));

// class FooReplacer {
//     static [Symbol.replace](target,replacement){
//         return target.split('foo').join(replacement)
//     }
// }
// console.log('barfoobaz'.replace(FooReplacer,'qux'));

// class StringReplacer{
//     constructor(str){
//         this.str = str
//     }
//      [Symbol.replace](target,replacement){
//         return target.split(this.str).join(replacement)
//     }
// }

// console.log('barfoobaz'.replace(new StringReplacer('foo'),'aaa'));


// class Bar extends Array{}
// class Baz extends Array{
//     static get [Symbol.species](){
//         return Array
//     }
// }

// let bar = new Bar()
// console.log(bar);
// console.log(bar instanceof Array);
// console.log(bar instanceof Bar);
// bar = bar.concat('bar')
// console.log(bar);
// console.log(bar instanceof Array);
// console.log(bar instanceof Bar);

// class Foo { }
// let foo = new Foo()
// console.log(3 + foo);
// console.log(3 - foo);
// console.log(String(foo));

// class Bar {
//      constructor(){
//         this[Symbol.toPrimitive] = function(hint){
//             switch(hint){
//                 case 'number':
//                     return 3;
//                 case 'string':
//                     return 'string bar';
//                 case 'default':
//                 default:
//                     return 'default bar';
//             }
//         }
//      }
// }
// let bar = new Bar()
// console.log(3+bar);
// console.log(3-bar);
// console.log(String(bar));


// let o = new Object({name:1})
// console.log(o);
// console.log(o.hasOwnProperty('name'));
// let n = 1
// ++ n 
// -- n
// console.log('打印***n',n)

// 1
// 0001
// 1110
// 1111

// let num = 18
// console.log(num.toString(2));
// console.log((-18).toString(2));

// const a = 8 | 1
// console.log('打印***a', 1.9999.toString(2), a)
// console.log(9 | 0)

// console.log(Math.floor(1.2));
// console.log(Math.floor(-1.2));//-2
// console.log(Math.ceil(-1.2));//-1
// console.log(Math.ceil(1.2));//2
// console.log(Math.trunc(1.2));//2
// console.log(Math.trunc(-1.2));//2
// console.log(1.2|0);//2
// console.log(-1.2|0);//2

// console.log(1 & 1);
// console.log(1 & 2);
// console.log(1 & 3);

// console.log(8 ^ 1);
// console.log(7 ^ 1);

// let a = 1 //0001  1
// let b = 3 //0011  3
// a = a ^ b //0010  2
// b = a ^ b //0001  1
// a = a ^ b //0011  3
// console.log('打印***a,b', a, b)


// let a = 1 //0001  1 1110 1001 1000
// let b = 3 //0011  3
// console.log(~a+1);
// console.log(8/3);
// console.log(8^8); 
// console.log(8^7);
// console.log(2.12<<0);
// console.log(2.12>>0);

// console.log(3%4);
// console.log(Math.pow(2,3));
// console.log(2**3);
// console.log(+0+(+0));
// console.log({a:1}.valueOf().toString());
// 小写字母编码》 大写

// console.log('Aa'<'AA');
// let arr = [11, 12, 13]
// for (let i = 0, a; a = arr[i++];) {
//     console.log(a);
// }
// for(;;){
//     console.log(1);
// }
// console.log('finish');

// for (const propName in window) {
//     document.write(propName+'<br/>');
// }

// let arr= [1,2,3,4,5]
// for(let i=0,n;n=arr[i++];){
//     for (let j = 0; j < 3; j++) {
//         if(j===1){
//             continue;
//         }
//         console.log('打印***j',j)
//     }
//     console.log(i);
// }

// (() => {
//     const arr = [1, 2, 3, 4, 5]
//     arr.forEach(a => {
//         if (a === 2) {
//             return
//         }
//         console.log(a);
//     })
// })()

// function func() {
//     const arr = [1, 2, 3, 4, 5]
//     arr.forEach(a => {
//         if (a === 2) {
//             throw '2'
//         }
//         console.log(a);
//     })
// }


// try {
//     func()
// } catch (error) {
//     console.log(error);
// }

// const num1 = BigInt(1.02)
// const num2 = BigInt(2.01)
// console.log(num1+num2);
// console.log(0.2+0.1);

// function setName(obj) {
//     obj.name = "Nicholas";
//     obj = new Object();
//     obj.name = "Greg";
// }
// let person = new Object();
// setName(person);
// console.log(person.name);

// function buildUrl() {
//     let qs = "?debug=true";
//     let url
//     with (location) {
//          url = href + qs;
//     }
//     return url;
// }
// console.log(buildUrl());

let now = new Date()
console.log(now);
console.log(Date.parse('2022-01-01'));
console.log(Date.UTC(2022,01,01,00,00,00));
console.log(Date.now());
console.log(Date().toString());
console.log(Date.toLocalString());